/*
 * RegistroIndice.cpp
 *
 *  Created on: 11/09/2011
 *      Author: emma
 */

#include "RegistroIndice.h"

RegistroIndice::RegistroIndice() {
}

vector<RegistroDePesosNormalizados> RegistroIndice::obtenerDocumentosAsociados() {
	return this->archivosAsociados;
}

/*si encuentra el id en la lista de arch asociados me da el registro que lo contiene, sino me da un
 * registroDePesosNormalizado vacio
 */
RegistroDePesosNormalizados RegistroIndice::obtenerDocumentoConID(int ID_doc){
	RegistroDePesosNormalizados *r_p_n = new RegistroDePesosNormalizados(0);
	//busca en la lista de doc asociados y si no encuentra el reg que tiene el ID_doc devuelve el registro vacio
	vector<RegistroDePesosNormalizados>::iterator it = this->archivosAsociados.begin();
    bool encontrado = false;
	while ((it != this->archivosAsociados.end()) & (!encontrado)){
		if((*it).get_ID_arch() == ID_doc){
			return (*it);
		}
		it++;
	}
    //si no lo encontro retorno el vacio
	return (*r_p_n);
}


void RegistroIndice::agregarDocumento(RegistroDePesosNormalizados unDocumento) {
	vector<RegistroDePesosNormalizados>::iterator it = this->archivosAsociados.begin();
	int i = 0;
	if(this->archivosAsociados.empty())
		this->archivosAsociados.push_back(unDocumento);
	else{
	while ((it != this->archivosAsociados.end()) & (unDocumento.getPeso() < (*it).getPeso())) {
		i++;
		it++;
	}
	if (it == this->archivosAsociados.end()) {
		this->archivosAsociados.push_back(unDocumento);
	} else {
		this->archivosAsociados.insert(it, unDocumento);
	}
	} //el del else
}

int RegistroIndice::obtenerLongitud(){
	int cant = this->archivosAsociados.size();
	int longitud = this->archivosAsociados[0].obtenerLongitud();

	return (cant*longitud);
}

RegistroIndice::~RegistroIndice() {

}

char* RegistroIndice::aBinario() {
	char* binario = new char[this->obtenerLongitud()];

	//paso a binario
	vector<RegistroDePesosNormalizados>::iterator it = this->archivosAsociados.begin();
	int offset = 0;
	while(it != this->archivosAsociados.end()){
		//obtengo un registro de peso normalizado
		RegistroDePesosNormalizados unReg = *it;
		//obtengo el id
		int id = (*it).get_ID_arch();
		//paso a binario el id
		memcpy(binario + offset,&id, sizeof(int));
		//incremento el offset
		offset += sizeof(int);
		//obtengo el peso
		float peso = (*it).getPeso();
		//paso a binario el peso
		memcpy(binario + offset, &peso, sizeof(float));
		//incremento el offset
		offset += sizeof(float);
		it++;
	}
	return binario;
}

void RegistroIndice::desdeBinario(char* binario, int longitudDelRegistro) {
//	char* reg = new char[longitudDelRegistro];


//	memcpy(reg, binario, longitudDelRegistro);
	for (int offset = 0; offset < (longitudDelRegistro-1); ){


		int id;
		memcpy(&id, binario + offset,sizeof(int));
		offset += sizeof(int);

		float peso;
		memcpy(&peso, binario + offset,sizeof(int));
		offset += sizeof(float);

		RegistroDePesosNormalizados* unDocumento = new RegistroDePesosNormalizados(id,peso);
		this->agregarDocumento(*unDocumento);

	}


}
